#pragma once
#include <iostream>
#include <string>
#include<set>

static const int line_size=1024;

class CommandExec {
    public:
    //设置白名单,只能执行一下命令
    CommandExec()
    {
        _white_list.insert("ls");
        _white_list.insert("pwd");
        _white_list.insert("ll");
        _white_list.insert("ls -l");
        _white_list.insert("touch");
        _white_list.insert("whoami");
        _white_list.insert("who");
    }
    //命令的安全检查
    bool SafeCheck(const std::string& cmdstr)
    {
        auto iter=_white_list.find(cmdstr);
        return (iter==_white_list.end());
    }
    //给你一个命令字符串“ls -l”，执行完把结果返回用户。
    std::string Execute(const std::string& cmd)
    {
        //1.创建一个管道
        //2.fork + dup2(pipe[1],1) +exec*，执行结果给父进程(进程间通信)通过管道给父进程pipe[0]
        //3.return 
        if(SafeCheck(cmd))
        {
            return std::string("不支持");
        }
        FILE* fp=::popen(cmd.c_str(),"r");
        if(nullptr==fp)
        {
            return std::string("Failed");
        }

        char buffer[line_size];
        std::string result;
        //除了这种我还可以加入选择命令过滤器
        while(true)
        {
            char* ret=::fgets(buffer,sizeof(buffer),fp);
            if(!ret)break;
            result+=ret;
        }
        pclose(fp);
        return result;
    }
    private:
    //这里加一个白名单
    std::set<std::string> _white_list;
};